package Base;

import java.util.ArrayList;
import java.util.Random;

public class Gen {
	int longitud;
	int[] cod;
	double max;
	double min;
	double tolerancia;
	
	public Gen(double min,double max,double tolerancia){
		this.min = min;
		this.max = max;
		this.tolerancia = tolerancia;
		this.longitud = getLongitud(max, min, tolerancia);
	}
	
	public Gen(double min,double max,double tolerancia,int longitud,int[] cod){
		this.min = min;
		this.max = max;
		this.tolerancia = tolerancia;
		this.longitud = longitud;
		this.cod = cod.clone();
	}
	
	public Gen(int n){
		this.longitud = n;
		this.cod = new int[n];
	}
	
	public Gen(double min,double max,double tolerancia,int longitud){
		this.min = min;
		this.max = max;
		this.tolerancia = tolerancia;
		this.longitud = longitud;
		this.cod = new int[longitud];
	}
	
	public Gen clone(){
		return new Gen(this.min,this.max,this.tolerancia,this.longitud,this.cod);
	}

	public int getLongitud() {
		return longitud;
	}

	public void setLongitud(int longitud) {
		this.longitud = longitud;
	}

	public double getMax() {
		return max;
	}

	public void setMax(double max) {
		this.max = max;
	}

	public double getMin() {
		return min;
	}

	public void setMin(double min) {
		this.min = min;
	}

	public double getTolerancia() {
		return tolerancia;
	}

	public void setTolerancia(double tolerancia) {
		this.tolerancia = tolerancia;
	}

	public int getCod(int i){
		return cod[i];
	}
	
	public void setCod(int i, int value){
		cod[i] = value;
	}
	
	public String toString(){
		String cadena = "[";
		for(int i=0;i<longitud;i++){
			cadena = cadena + cod[i] + " ";
		}
		return cadena + "]";
	}
	
	public void inicializacion(){
		cod = new int[longitud];
		Random r = new Random();
		for(int i=0;i<longitud;i++){
			cod[i] = r.nextInt(2);
		}
	}
	
	public void inicializacionGenS(){
		if (cod == null) cod = new int[longitud];
		ArrayList<Integer> cogidos = new ArrayList<Integer>();
		for(int i = 1; i <= longitud; i++)
			cogidos.add(i);
				
		Random r = new Random();
		for(int i=0;i<longitud;i++){
			int v = r.nextInt(cogidos.size());
			cod[i] = cogidos.remove(v);
		}
	}
	
	public double bin_dec(){
		if (cod == null || cod.length == 0) return 0;
		int valor = 0;
		for(int i=0; i<longitud;i++){
			valor  = valor + (int)(Math.pow(2, longitud-1-i)*cod[i]);
		}
		double v = (min + (max-min)*valor/(Math.pow(2,longitud)-1));
		return v;
	}
	
	private int getLongitud(double max,double min,double tolerancia){
		int l = 0;
		double v = 1 + (max - min)/tolerancia;
		l = (int)(Math.log10(v)/Math.log10(2)) + 1;
		return l;
	}
}
